/*
 * as5600.h
 *
 *  Created on: [Your Date]
 *      Author: [Your Name]
 *
 *  Description:
 *  Header file for the AS5600 magnetic rotary position sensor driver.
 *  This driver is designed to be portable and easy to use with STM32 HAL
 * library.
 */

#ifndef INC_AS5600_H_
#define INC_AS5600_H_

#include "stm32f4xx_hal.h" // 包含此文件以使用 I2C_HandleTypeDef 类型，这是与平台相关的部分
#include <stdint.h>

/*************** 宏定义 *****************/
// AS5600 的 7 位 I2C 地址
#define AS5600_I2C_ADDR 0x36

/* AS5600 寄存器地址 */
#define AS5600_REG_ZMCO 0x00
#define AS5600_REG_ZPOS_H 0x01
#define AS5600_REG_ZPOS_L 0x02
#define AS5600_REG_MPOS_H 0x03
#define AS5600_REG_MPOS_L 0x04
#define AS5600_REG_MANG_H 0x05
#define AS5600_REG_MANG_L 0x06
#define AS5600_REG_CONF_H 0x07
#define AS5600_REG_CONF_L 0x08
#define AS5600_REG_RAW_ANGLE_H 0x0C
#define AS5600_REG_RAW_ANGLE_L 0x0D
#define AS5600_REG_ANGLE_H 0x0E
#define AS5600_REG_ANGLE_L 0x0F
#define AS5600_REG_STATUS 0x0B
#define AS5600_REG_AGC 0x1A
#define AS5600_REG_MAGNITUDE_H 0x1B
#define AS5600_REG_MAGNITUDE_L 0x1C
#define AS5600_REG_BURN 0xFF

// 角度单位转换常量
#define AS5600_RAW_TO_DEG (360.0f / 4096.0f)
#define AS5600_RAW_TO_RAD (2.0f * PI / 4095.0f)
/*************** 宏定义 *****************/

/*************** 函数声明 *****************/
/**
 * @brief 初始化 AS5600 驱动
 * @param hi2c 指向 I2C 句柄的指针
 * @return HAL_StatusTypeDef HAL 状态
 */
HAL_StatusTypeDef AS5600_Init(I2C_HandleTypeDef *hi2c);

/**
 * @brief 获取原始角度值 (0 - 4095)
 * @param hi2c 指向 I2C 句柄的指针
 * @param raw_angle 指向用于存储原始角度值的变量的指针
 * @return HAL_StatusTypeDef HAL 状态
 */
HAL_StatusTypeDef AS5600_GetRawAngle(I2C_HandleTypeDef *hi2c,
                                     uint16_t *raw_angle);

/**
 * @brief 获取经过缩放和滤波的角度值 (0 - 4095)
 *        这个值由 AS5600 内部根据 ZPOS 和 MPOS 设置计算得出
 * @param hi2c 指向 I2C 句柄的指针
 * @param scaled_angle 指向用于存储缩放后角度值的变量的指针
 * @return HAL_StatusTypeDef HAL 状态
 */
HAL_StatusTypeDef AS5600_GetScaledAngle(I2C_HandleTypeDef *hi2c,
                                        uint16_t *scaled_angle);

/**
 * @brief 将原始角度值转换为度数 (0.0 - 360.0)
 * @param raw_angle 原始角度值 (0-4095)
 * @return 对应的度数值
 */
float AS5600_RawAngleToDegrees(uint16_t raw_angle);

float AS5600_RawAngleToRadians(uint16_t raw_angle);

/**
 * @brief 检测磁铁是否存在或过强/过弱
 * @param hi2c 指向 I2C 句柄的指针
 * @param status 指向存储状态值的变量的指针 (bit 5: MD, bit 4: ML, bit 3:
 * MH)
 * @return HAL_StatusTypeDef HAL 状态
 *         - MD (Magnet Detected): 1 表示检测到磁铁
 *         - ML (Magnet too Weak):  1 表示磁场太弱
 *         - MH (Magnet too Strong): 1 表示磁场太强
 */
HAL_StatusTypeDef AS5600_GetStatus(I2C_HandleTypeDef *hi2c, uint8_t *status);
/*************** 函数声明 *****************/

#endif /* INC_AS5600_H_ */
